R script for clusters and Trees
General Data and package loading
############ Packeges ############
rm(list=ls()) #clear whole work space
set.seed(1234)
library(tidyr)
library(ggplot2)
library(dplyr)
library(ggtree)
library(readxl)
library(reshape2)
library(phytools)
library(ggpubr)
library(FSA)
library(RColorBrewer)
library(forcats)
############ Packeges ############
my_col2 <- brewer.pal(6,"Dark2")
my_col3 <- c(my_col2[2],
my_col2[1],
my_col2[3],
my_col2[5],
my_col2[4],
my_col2[6])
MIC50 data loading
# MIC50 values from clinical isolates
MIC50.clin <- read_xlsx("../data/MIC50_clean.xlsx")
# MIC50 values from agricultural isolates
MIC50.agr <- read.csv("../data//MIC50_agr.csv", sep=";")
# Metadata for clinical isolates
isolate_info_clin <- read_excel("../data/Isolate_info_clin.xlsx")
# Metadata for agricultural isolates
isolate_info <- read.csv("../data/Isolate_info.csv", sep=";")
isolate_info$Isolate_ID[which(isolate_info$Isolate_ID == "214")] <- 241 #correcting Spelling mistake
# merging the two MIC50 values
MIC50.agr <- merge(isolate_info[,c("Isolate_ID","Isolate_name")] ,MIC50.agr, by.x = "Isolate_name", by.y = "Isolate_name", all.x = TRUE)
colnames(MIC50.clin)[c(1,2)] <- c("Isolate_ID", "Isolate_name")
MIC50.agr <- MIC50.agr[,colnames(MIC50.agr)[c(2,1,3:5)]]
colnames(MIC50.agr) <- colnames(MIC50.clin)
All_MIC50_wide <- rbind(MIC50.agr, MIC50.clin)
All_MIC50 <- melt(All_MIC50_wide, id.vars = colnames(All_MIC50_wide)[c(1,2)], variable.name = "Fungicide", value.name = "MIC50")
#### remove outlier #####
# All_MIC50 <- All_MIC50[-which(All_MIC50$Isolate_name %in% c("AL4e","LC5.2") & All_MIC50$Fungicide == "MIC50.CYP") ,]
### Adjusting outlier to max value tested ###
All_MIC50[which(All_MIC50$Isolate_name %in% c("AL4e", "LC5.2") & All_MIC50$Fungicide == "Cyprodinil"),"MIC50"] <- 128
Tree clinical vs agricultural isolates
# Loading the tree
tree <- read.tree("../data/221111_phame_all_final_RaxML/results/trees/RAxML_bipartitions.221111_Apul_final_RaxML_all_best")
### Tip label correction
tip_lab <- tree$tip.label
tree_isolate_info <- All_isolate_info[,c("Isolate_ID","Isolate_name")]
tree_isolate_info$Isolate_ID <- paste(tree_isolate_info$Isolate_ID,
"_contigs_contig",
sep = "")
tree_isolate_info <- rbind(tree_isolate_info , Other_var_df[,c(1,5)])
tree_isolate_info <- rbind(tree_isolate_info , c("AurpulNBB1_AssemblyScaffolds_Repeatmasked","NBB_7.2.1"))
tip_lab <- merge(as.data.frame(tip_lab),tree_isolate_info ,by.x = "tip_lab",by.y = "Isolate_ID", all.x = TRUE)
tree$tip.label <- tip_lab[[2]][match(tree$tip.label, tip_lab[[1]])]
# Reference added to meta data
All_isolate_info <- rbind(All_isolate_info,c("AurpulNBB1_AssemblyScaffolds_Repeatmasked",NA,NA,NA,"NBB_7.2.1", "reference", "JGI"))
All_isolate_info <- rbind(All_isolate_info,Other_var_df)
# clinical vs agricultural in group info
group_info <- split(All_isolate_info$Isolate_name, All_isolate_info$group)
tree <- groupOTU(tree,group_info)
# extracting bootstrap values for labeling
bootstrap <- as.numeric(tree$node.label)
bootstrap[which(bootstrap < 90)] <- NA #removing bootstrap below 90%
bootstrap <- c(rep(NA, times = 51),bootstrap)
# plotting the tree
p <- ggtree(tree, aes(color = group)) +
theme_tree2() +
geom_nodelab(aes(label = bootstrap), hjust =1.3, vjust = -0.3, size = 2.5) +
geom_tiplab(hjust = 0, size = 3, vjust = 0.5) +
labs(title = "Phylogenetic Tree with all SNP's and all isolates") +
xlim(0,1.1)
p

# collaping other variant clade
cp <- collapse(p + xlim(0,0.11) + labs(title = "Phylogenetic Tree with all SNP's and all isolates with collapsed node"), node=85)
## Scale for 'x' is already present. Adding another scale for 'x', which will
## replace the existing scale.
cp

# viewClade(p + labs(title = "Phylogenetic Tree with all SNP's and all isolates the collapsed node"), node = 72)
Clustering
# extracting phylogenetic distance form the tree
phylo.dist <- cophenetic.phylo(tree)
dist2 <- as.matrix(dist(phylo.dist, method = "euclidean"))
# hierarchical clustering with generating two clusters (a. pullulans vs non A. pullulans)
hc <- hclust(dist(phylo.dist, method = "euclidean"), method = "complete")
hccut <- as.data.frame(cutree(hc, k = 2))
All_isolate_info$cluster <- as.factor(hccut[,1][match(All_isolate_info$Isolate_name,
rownames(hccut))])
# removing non A. pullulans form distance matrix
phylo.dist.pul <- phylo.dist[-which(rownames(phylo.dist) %in%
All_isolate_info$Isolate_name[which(All_isolate_info$cluster == 2)]),
-which(colnames(phylo.dist) %in%
All_isolate_info$Isolate_name[which(All_isolate_info$cluster == 2)])]
# hierarchical clustering only with A. pullulans
k <- 5 # number of meaningfull clusters
hc <- hclust(dist(phylo.dist.pul, method = "euclidean"), method = "complete")
hccut <- as.data.frame(cutree(hc, k = k))
All_isolate_info$cluster2 <- as.character(hccut[,1][match(All_isolate_info$Isolate_name, rownames(hccut))])
All_isolate_info$cluster2[which(is.na(All_isolate_info$cluster2))] <- k+1
# naming the clusters
c_nam <- data.frame(cluster2 = c(1:(k+1)),
c_names = c("clinical pullulans",
"Agricultural A. pullulans (I)",
"Agricultural A. pullulans (T)",
"A. pul clin own cluster",
"Agricultural A. pullulans (S)",
"clinical non pullulans"))
# Ordering clusters and adding the clusters to the metadata
c_nam <- mutate(c_nam, c_names = fct_relevel(c_names,
"clinical non pullulans",
"A. pul clin own cluster" ,
"clinical pullulans",
"Agricultural A. pullulans (S)",
"Agricultural A. pullulans (I)",
"Agricultural A. pullulans (T)"
))
names(my_col3) <- c_nam$c_names[order(c_nam$c_names)]
All_isolate_info_c2 <- merge(All_isolate_info, c_nam, by.x = "cluster2", by.y = "cluster2", all.x = T)
Tree rooted with A. subglaciale
# rooting the three with A. subglaciale
tree.rooted <- root(tree, which(tree$tip.label == "A. subglaciale"))
# clusters as group info
group_info <- split(All_isolate_info$Isolate_name, All_isolate_info$cluster)
tree.rooted <- groupOTU(tree.rooted,group_info)
# plotting the tree pullulans vs non pullulans
p <- ggtree(tree.rooted, aes(color = group)
) +
theme_tree2() +
# geom_text(aes(label = node)) +
# geom_tiplab(hjust = 0, size = 3, vjust = 0.5) +
labs(title = "Phylogenetic Tree with all SNP's and all isolates") +
xlim(0,1.1)+
scale_color_manual(values=c(my_col3)[c(1,2)])
p +
geom_cladelabel(node=85, label=expression(italic("A. Pullulans")),
color=c(my_col3)[1],
offset=.075, align=TRUE
) +
geom_cladelabel(node=86, label=expression(paste("non ",italic("A. Pullulans"))),
color=c(my_col3)[2], offset=.075, align=TRUE)
## Warning in is.na(x): is.na() applied to non-(list or vector) of type
## 'expression'
## Warning in is.na(x): is.na() applied to non-(list or vector) of type
## 'expression'

# cluster as group info
group_info <- split(All_isolate_info_c2$Isolate_name, All_isolate_info_c2$c_names)
tree.rooted <- groupOTU(tree.rooted,group_info)
# plotting tree with all clusters
p <- ggtree(tree.rooted, aes(color = group)
) +
theme_tree2() +
# geom_text(aes(label = node)) +
geom_tiplab(hjust = 0, size = 3, vjust = 0.5) +
scale_color_manual(values=c(my_col3))
# plotting tree with collapsed non pullulans clade
cp <- collapse(p +
geom_nodelab(aes(label = bootstrap), hjust = 1.2, vjust = -0.2, size = 2.5) +
xlim(.225,.325) +
labs(title = expression(paste("Phylogenetic Tree with ",
italic("A. Pullulans"),
" isolates"))),
node= 86)
cp

# plotting tree with collapsed pullulans clade
cp2 <- collapse(p +
geom_nodelab(aes(label = bootstrap), hjust = 1.2, vjust = -0.2, size = 2.5) +
xlim(0,1) +
labs(title = expression(paste("Phylogenetic Tree with non ",
italic("A. Pullulans"),
" isolates"))),
node= 85)
cp2

Unrooted Trees
# clusters as group info
group_info <- split(All_isolate_info_c2$Isolate_name, All_isolate_info_c2$c_names)
tree<- groupOTU(tree,group_info)
# plotting tree with all clusters
p <- ggtree(tree, aes(color = group)
) +
theme_tree2() +
# geom_text(aes(label = node)) +
geom_tiplab(hjust = 0, size = 3, vjust = 0.5) +
xlim(0,1.1) +
scale_color_manual(values=c(my_col3))
p

# plotting tree with collapsed non pullulans clade
cp <- collapse(p +
# geom_nodelab(aes(label = bootstrap), hjust = 1.6, vjust = -0.2, size = 2.5) +
xlim(0,.09) +
labs(title = expression(paste("Phylogenetic Tree with ",
italic("A. Pullulans"),
" isolates"))),
node= 85)
## Scale for 'x' is already present. Adding another scale for 'x', which will
## replace the existing scale.
cp

cp <- collapse(p +
geom_nodelab(aes(label = bootstrap), hjust = 1.6, vjust = -0.2, size = 2.5) +
xlim(0,.09) +
labs(title = expression(paste("Phylogenetic Tree with ",
italic("A. Pullulans"),
" isolates"))),
node= 85)
## Scale for 'x' is already present. Adding another scale for 'x', which will
## replace the existing scale.
cp

# plotting collapsed non pullulans clade
viewClade(p +
geom_nodelab(aes(label = bootstrap), hjust = 1.2, vjust = -0.2, size = 2.5) +
xlim(0,1.1) +
labs(title = expression(paste("Phylogenetic Tree with non ",
italic("A. Pullulans"),
" isolates"))),
node= 85)
## Scale for 'x' is already present. Adding another scale for 'x', which will
## replace the existing scale.

MIC50 significance testing
# merging MIC50 values with meta data
All_MIC50_info <- merge(All_MIC50, All_isolate_info_c2[,c(1,2,7,8,9,10)], by.x = "Isolate_ID", by.y = "Isolate_ID", all.x = TRUE)
# log 2 for foldchange in MIC 50
All_MIC50_info$MIC50 <- log2(All_MIC50_info$MIC50)
dunn.df <- matrix(nrow = 15)
for (i in unique(All_MIC50_info$Fungicide)) {
dunn.mod <- dunnTest(MIC50 ~ c_names,
data=All_MIC50_info[which(All_MIC50_info$Fungicide == i),],
method="bh")
dunn.df[,1] <- dunn.mod[["res"]][["Comparison"]]
dunn.inter <- data.frame(dunn.mod[["res"]][["P.adj"]])
colnames(dunn.inter) <- paste("P.adj_", i)
dunn.df <- cbind(dunn.df,dunn.inter)
}
MIC50 boxplots
# Boxplot of the MIC50 values agricultural vs clinical
ggplot(data = All_MIC50_info, aes (x = group, y = MIC50, col = group)) +
geom_boxplot() +
facet_wrap(~Fungicide, scales = "free") +
stat_compare_means(method = "wilcox.test", aes(label = ifelse(
p < 1.e-3,
sprintf("Wilcox, p = < 0.001"),
sprintf("Wilcox, p = %5.3f", as.numeric(..p.format..)))))

ggplot(data = All_MIC50_info, aes (x = cluster, y = MIC50, col = cluster)) +
geom_boxplot() +
scale_color_discrete(labels = c("pullulans", "non pullulans"))+
facet_wrap(~Fungicide, scales = "free") +
stat_compare_means(method = "wilcox.test", aes(label = ifelse(
p < 1.e-3,
sprintf("Wilcox, p = < 0.001"),
sprintf("Wilcox, p = %5.3f", as.numeric(..p.format..)))))

label_dunn <- c("B","B","B","B","A", "A","A",
"AB","B","B","B","AB", "A",
"C","ABC", "BC","BC","AB", "A")
label_dunn_df <- data.frame(sig_lab = c("B","B","B","B","A", "A",
"AB","B","B","B","AB", "A",
"C","ABC", "BC","BC","AB", "A"),
c_names = rep(c("clinical non pullulans",
"A. pul clin own cluster" ,
"clinical pullulans",
"Agricultural A. pullulans (S)",
"Agricultural A. pullulans (I)",
"Agricultural A. pullulans (T)"), times= 3),
Fungicide = c(rep("Captan", times = 6),
rep("Cyprodinil", times = 6),
rep("Difenoconazole", times = 6)),
MIC50 = c(rep(7, times = 6),
rep(7.5, times = 6),
rep(3.75, times = 6))
)
# Boxplot of the MIC50 values phylogenetic clusters
All_MIC50_info%>%
mutate(c_names = fct_relevel(c_names,
"clinical non pullulans",
"A. pul clin own cluster" ,
"clinical pullulans",
"Agricultural A. pullulans (S)",
"Agricultural A. pullulans (I)",
"Agricultural A. pullulans (T)"
)) %>%
ggplot(aes(x = c_names, y = MIC50, colour = c_names)) +
geom_boxplot() +
facet_wrap(~Fungicide, scales = "free") +
theme(legend.position = "none") +
# stat_compare_means(method = "kruskal.test", hjust = 0.1, aes(label = ifelse(
# p < 1.e-3,
# sprintf("Kruskal, p = < 0.001"),
# sprintf("Kruskal, p = %5.3f", as.numeric(..p.format..))))) +
theme(axis.text.x = element_text(angle=90, vjust=0.5, hjust = 1, size = 8))+
xlab(NULL)+
geom_text(data = label_dunn_df, aes(label = sig_lab, colour = "black"))+
scale_color_manual(values=c(my_col3))

Session info
devtools::session_info()
## ─ Session info ───────────────────────────────────────────────────────────────
## setting value
## version R version 4.2.2 Patched (2022-11-10 r83330)
## os Ubuntu 20.04.5 LTS
## system x86_64, linux-gnu
## ui X11
## language (EN)
## collate en_US.UTF-8
## ctype en_US.UTF-8
## tz Europe/Zurich
## date 2023-02-06
## pandoc 2.19.2 @ /usr/lib/rstudio-server/bin/quarto/bin/tools/ (via rmarkdown)
##
## ─ Packages ───────────────────────────────────────────────────────────────────
## package * version date (UTC) lib source
## abind 1.4-5 2016-07-21 [1] RSPM (R 4.2.0)
## ape * 5.6-2 2022-03-02 [1] RSPM (R 4.2.0)
## aplot 0.1.3 2022-04-01 [1] RSPM (R 4.2.0)
## assertthat 0.2.1 2019-03-21 [2] RSPM (R 4.2.0)
## backports 1.4.1 2021-12-13 [2] RSPM (R 4.2.0)
## broom 0.8.0 2022-04-13 [1] RSPM (R 4.2.0)
## bslib 0.4.2 2022-12-16 [2] RSPM (R 4.2.0)
## cachem 1.0.6 2021-08-19 [2] RSPM (R 4.2.0)
## callr 3.7.3 2022-11-02 [2] RSPM (R 4.2.0)
## car 3.0-12 2021-11-06 [1] RSPM (R 4.2.0)
## carData 3.0-5 2022-01-06 [1] RSPM (R 4.2.0)
## cellranger 1.1.0 2016-07-27 [2] RSPM (R 4.2.0)
## cli 3.6.0 2023-01-09 [2] RSPM (R 4.2.0)
## clusterGeneration 1.3.7 2020-12-15 [1] RSPM (R 4.2.0)
## coda 0.19-4 2020-09-30 [1] RSPM (R 4.2.0)
## codetools 0.2-18 2020-11-04 [4] CRAN (R 4.0.3)
## colorspace 2.0-3 2022-02-21 [1] RSPM (R 4.2.0)
## combinat 0.0-8 2012-10-29 [1] RSPM (R 4.2.0)
## crayon 1.5.2 2022-09-29 [2] RSPM (R 4.2.0)
## DBI 1.1.3 2022-06-18 [2] RSPM (R 4.2.0)
## devtools 2.4.5 2022-10-11 [2] RSPM (R 4.2.0)
## digest 0.6.31 2022-12-11 [2] RSPM (R 4.2.0)
## dplyr * 1.0.9 2022-04-28 [1] RSPM (R 4.2.0)
## dunn.test 1.3.5 2017-10-27 [1] RSPM (R 4.2.0)
## ellipsis 0.3.2 2021-04-29 [2] RSPM (R 4.2.0)
## evaluate 0.20 2023-01-17 [2] RSPM (R 4.2.0)
## expm 0.999-6 2021-01-13 [1] RSPM (R 4.2.0)
## fansi 1.0.4 2023-01-22 [2] RSPM (R 4.2.0)
## farver 2.1.0 2021-02-28 [1] RSPM (R 4.2.0)
## fastmap 1.1.0 2021-01-25 [2] RSPM (R 4.2.0)
## fastmatch 1.1-3 2021-07-23 [1] RSPM (R 4.2.0)
## forcats * 0.5.1 2021-01-27 [1] RSPM (R 4.2.0)
## fs 1.6.0 2023-01-23 [2] RSPM (R 4.2.0)
## FSA * 0.9.3 2022-02-18 [1] RSPM (R 4.2.0)
## generics 0.1.2 2022-01-31 [1] RSPM (R 4.2.0)
## ggfun 0.0.6 2022-04-01 [1] RSPM (R 4.2.0)
## ggplot2 * 3.3.5 2021-06-25 [1] RSPM (R 4.2.0)
## ggplotify 0.1.0 2021-09-02 [1] RSPM (R 4.2.0)
## ggpubr * 0.4.0 2020-06-27 [1] RSPM (R 4.2.0)
## ggsignif 0.6.3 2021-09-09 [1] RSPM (R 4.2.0)
## ggtree * 3.4.0 2022-04-26 [1] Bioconductor
## glue 1.6.2 2022-02-24 [2] RSPM (R 4.2.0)
## gridGraphics 0.5-1 2020-12-13 [1] RSPM (R 4.2.0)
## gtable 0.3.0 2019-03-25 [1] RSPM (R 4.2.0)
## highr 0.10 2022-12-22 [2] RSPM (R 4.2.0)
## htmltools 0.5.4 2022-12-07 [2] RSPM (R 4.2.0)
## htmlwidgets 1.6.1 2023-01-07 [2] CRAN (R 4.2.2)
## httpuv 1.6.8 2023-01-12 [2] RSPM (R 4.2.0)
## igraph 1.3.1 2022-04-20 [1] RSPM (R 4.2.0)
## jquerylib 0.1.4 2021-04-26 [2] RSPM (R 4.2.0)
## jsonlite 1.8.4 2022-12-06 [2] RSPM (R 4.2.0)
## knitr 1.41 2022-11-18 [1] RSPM (R 4.2.0)
## labeling 0.4.2 2020-10-20 [1] RSPM (R 4.2.0)
## later 1.3.0 2021-08-18 [2] RSPM (R 4.2.0)
## lattice 0.20-45 2021-09-22 [4] CRAN (R 4.2.0)
## lazyeval 0.2.2 2019-03-15 [1] RSPM (R 4.2.0)
## lifecycle 1.0.3 2022-10-07 [2] CRAN (R 4.2.1)
## magrittr 2.0.3 2022-03-30 [2] RSPM (R 4.2.0)
## maps * 3.4.0 2021-09-25 [1] RSPM (R 4.2.0)
## MASS 7.3-57 2022-04-22 [1] RSPM (R 4.2.0)
## Matrix 1.5-1 2022-09-13 [4] CRAN (R 4.2.1)
## memoise 2.0.1 2021-11-26 [2] RSPM (R 4.2.0)
## mime 0.12 2021-09-28 [2] RSPM (R 4.2.0)
## miniUI 0.1.1.1 2018-05-18 [2] RSPM (R 4.2.0)
## mnormt 2.0.2 2020-09-01 [1] RSPM (R 4.2.0)
## munsell 0.5.0 2018-06-12 [1] RSPM (R 4.2.0)
## nlme 3.1-161 2022-12-15 [4] CRAN (R 4.2.2)
## numDeriv 2016.8-1.1 2019-06-06 [1] RSPM (R 4.2.0)
## patchwork 1.1.1 2020-12-17 [1] RSPM (R 4.2.0)
## phangorn 2.8.1 2021-12-15 [1] RSPM (R 4.2.0)
## phytools * 1.0-3 2022-04-05 [1] RSPM (R 4.2.0)
## pillar 1.8.1 2022-08-19 [2] RSPM (R 4.2.0)
## pkgbuild 1.4.0 2022-11-27 [2] RSPM (R 4.2.0)
## pkgconfig 2.0.3 2019-09-22 [2] RSPM (R 4.2.0)
## pkgload 1.3.2 2022-11-16 [2] RSPM (R 4.2.0)
## plotrix 3.8-2 2021-09-08 [1] RSPM (R 4.2.0)
## plyr 1.8.7 2022-03-24 [1] RSPM (R 4.2.0)
## prettyunits 1.1.1 2020-01-24 [2] RSPM (R 4.2.0)
## processx 3.8.0 2022-10-26 [2] RSPM (R 4.2.0)
## profvis 0.3.7 2020-11-02 [2] RSPM (R 4.2.0)
## promises 1.2.0.1 2021-02-11 [2] RSPM (R 4.2.0)
## ps 1.7.2 2022-10-26 [2] RSPM (R 4.2.0)
## purrr 1.0.1 2023-01-10 [2] RSPM (R 4.2.0)
## quadprog 1.5-8 2019-11-20 [1] RSPM (R 4.2.0)
## R6 2.5.1 2021-08-19 [2] RSPM (R 4.2.0)
## RColorBrewer * 1.1-3 2022-04-03 [1] RSPM (R 4.2.0)
## Rcpp 1.0.10 2023-01-22 [2] RSPM (R 4.2.0)
## readxl * 1.4.1 2022-08-17 [2] RSPM (R 4.2.0)
## remotes 2.4.2 2021-11-30 [2] RSPM (R 4.2.0)
## reshape2 * 1.4.4 2020-04-09 [1] RSPM (R 4.2.0)
## rlang 1.0.6 2022-09-24 [2] RSPM (R 4.2.0)
## rmarkdown 2.20 2023-01-19 [2] RSPM (R 4.2.0)
## rstatix 0.7.0 2021-02-13 [1] RSPM (R 4.2.0)
## rstudioapi 0.14 2022-08-22 [2] RSPM (R 4.2.0)
## sass 0.4.5 2023-01-24 [2] RSPM (R 4.2.0)
## scales 1.2.0 2022-04-13 [1] RSPM (R 4.2.0)
## scatterplot3d 0.3-41 2018-03-14 [1] RSPM (R 4.2.0)
## sessioninfo 1.2.2 2021-12-06 [2] RSPM (R 4.2.0)
## shiny 1.7.4 2022-12-15 [2] RSPM (R 4.2.0)
## stringi 1.7.12 2023-01-11 [2] RSPM (R 4.2.0)
## stringr 1.5.0 2022-12-02 [2] RSPM (R 4.2.0)
## tibble 3.1.8 2022-07-22 [2] RSPM (R 4.2.0)
## tidyr * 1.2.0 2022-02-01 [1] RSPM (R 4.2.0)
## tidyselect 1.2.0 2022-10-10 [2] RSPM (R 4.2.0)
## tidytree 0.3.9 2022-03-04 [1] RSPM (R 4.2.0)
## tmvnsim 1.0-2 2016-12-15 [1] RSPM (R 4.2.0)
## treeio 1.20.0 2022-04-26 [1] Bioconductor
## urlchecker 1.0.1 2021-11-30 [2] RSPM (R 4.2.0)
## usethis 2.1.6 2022-05-25 [2] RSPM (R 4.2.0)
## utf8 1.2.3 2023-01-31 [2] RSPM (R 4.2.0)
## vctrs 0.5.2 2023-01-23 [2] RSPM (R 4.2.0)
## withr 2.5.0 2022-03-03 [2] RSPM (R 4.2.0)
## xfun 0.37 2023-01-31 [2] RSPM (R 4.2.0)
## xtable 1.8-4 2019-04-21 [2] RSPM (R 4.2.0)
## yaml 2.3.7 2023-01-23 [2] RSPM (R 4.2.0)
## yulab.utils 0.0.4 2021-10-09 [1] RSPM (R 4.2.0)
##
## [1] /home/agsad.admin.ch/f80854568/R/x86_64-pc-linux-gnu-library/4.2
## [2] /usr/local/lib/R/site-library
## [3] /usr/lib/R/site-library
## [4] /usr/lib/R/library
##
## ──────────────────────────────────────────────────────────────────────────────